home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Amiga Games Extra 1996 September
/
Amiga Games Extra CD-ROM 9-1996.iso
/
userbox
/
publicdomain
/
vim-4.2
/
src
/
gui_motif.c
< prev
next >
Wrap
C/C++ Source or Header
|
1996-06-09
|
20KB
|
794 lines
/* vi:set ts=4 sw=4:
*
* VIM - Vi IMproved by Bram Moolenaar
* GUI/Motif support by Robert Webb
*
* Do ":help uganda" in Vim to read copying and usage conditions.
* Do ":help credits" in Vim to see a list of people who contributed.
*/
#include <Xm/Form.h>
#include <Xm/RowColumn.h>
#include <Xm/PushB.h>
#include <Xm/PanedW.h>
#include <Xm/CascadeB.h>
#include <Xm/ScrollBar.h>
#include <Xm/RowColumn.h>
#include <Xm/MenuShell.h>
#if (XmVersion >= 1002)
# include <Xm/RepType.h>
#endif
#include <X11/keysym.h>
#include <X11/Xatom.h>
#include <X11/StringDefs.h>
#include "vim.h"
#include "globals.h"
#include "proto.h"
#include "option.h"
#include "ops.h"
extern Widget vimShell;
static Widget vimForm;
static Widget textArea;
static Widget scrollbarBox[3]; /* Left, right & bottom scrollbar boxes */
static Widget menuBar;
/*
* Call-back routines.
*/
static void
scroll_cb(w, client_data, call_data)
Widget w;
XtPointer client_data, call_data;
{
char_u bytes[4 + sizeof(long_u)];
WIN *wp;
GuiScrollbar *sb;
int sb_num;
if (((XmScrollBarCallbackStruct *)call_data)->reason == XmCR_DRAG)
gui.dragged_sb = (XtParent(w) == scrollbarBox[SB_LEFT]) ? SB_LEFT
: SB_RIGHT;
else
gui.dragged_sb = SB_NONE;
gui.dragged_wp = (WIN *)client_data;
sb_num = 0;
for (wp = firstwin; wp != gui.dragged_wp && wp != NULL; wp = wp->w_next)
sb_num++;
bytes[0] = CSI;
bytes[1] = KS_SCROLLBAR;
bytes[2] = K_FILLER;
bytes[3] = (char_u)sb_num;
if (gui.dragged_wp == NULL)
sb = &gui.cmdline_sb;
else
sb = &wp->w_scrollbar;
sb->value = ((XmScrollBarCallbackStruct *)call_data)->value;
add_long_to_buf((long_u)sb->value, bytes + 4);
add_to_input_buf(bytes, 4 + sizeof(long_u));
}
static void
horiz_scroll_cb(w, client_data, call_data)
Widget w;
XtPointer client_data, call_data;
{
char_u bytes[3 + sizeof(long_u)];
if (((XmScrollBarCallbackStruct *)call_data)->reason == XmCR_DRAG)
gui.dragged_sb = SB_BOTTOM;
else
gui.dragged_sb = SB_NONE;
bytes[0] = CSI;
bytes[1] = KS_HORIZ_SCROLLBAR;
bytes[2] = K_FILLER;
add_long_to_buf((long_u)((XmScrollBarCallbackStruct *)call_data)->value,
bytes + 3);
add_to_input_buf(bytes, 3 + sizeof(long_u));
}
/*
* End of call-back routines
*/
/*
* Create all the motif widgets necessary.
*/
void
gui_mch_create_widgets()
{
int i;
Dimension n;
/*
* Start out by adding the configured border width into the border offset
*/
gui.border_offset = gui.border_width;
/*
* Install the tearOffModel resource converter.
*/
#if (XmVersion >= 1002)
XmRepTypeInstallTearOffModelConverter();
#endif
XtInitializeWidgetClass(xmFormWidgetClass);
XtInitializeWidgetClass(xmRowColumnWidgetClass);
XtInitializeWidgetClass(xmRowColumnWidgetClass);
XtInitializeWidgetClass(xmPrimitiveWidgetClass);
vimForm = XtVaCreateManagedWidget("vimForm",
xmFormWidgetClass, vimShell,
XmNresizePolicy, XmRESIZE_GROW,
XmNforeground, gui.menu_fg_pixel,
XmNbackground, gui.menu_bg_pixel,
NULL);
menuBar = XtVaCreateManagedWidget("menuBar",
xmRowColumnWidgetClass, vimForm,
XmNresizeHeight, False,
#if (XmVersion >= 1002)
XmNtearOffModel, XmTEAR_OFF_ENABLED,
#endif
XmNtopAttachment, XmATTACH_FORM,
XmNleftAttachment, XmATTACH_FORM,
XmNrightAttachment, XmATTACH_FORM,
XmNrowColumnType, XmMENU_BAR,
XmNheight, gui.menu_height,
XmNforeground, gui.menu_fg_pixel,
XmNbackground, gui.menu_bg_pixel,
NULL);
scrollbarBox[SB_LEFT] = XtVaCreateWidget("leftScrollBarBox",
xmRowColumnWidgetClass, vimForm,
XmNresizeWidth, False,
XmNtopAttachment, XmATTACH_WIDGET,
XmNtopWidget, menuBar,
XmNbottomAttachment, XmATTACH_FORM,
XmNleftAttachment, XmATTACH_FORM,
XmNmarginWidth, 0,
XmNmarginHeight, 0,
XmNspacing, 0,
XmNwidth, gui.scrollbar_width,
XmNforeground, gui.scroll_fg_pixel,
XmNbackground, gui.scroll_fg_pixel,
NULL);
scrollbarBox[SB_RIGHT] = XtVaCreateWidget("rightScrollBarBox",
xmRowColumnWidgetClass, vimForm,
XmNresizeWidth, False,
XmNtopAttachment, XmATTACH_WIDGET,
XmNtopWidget, menuBar,
XmNbottomAttachment, XmATTACH_FORM,
XmNrightAttachment, XmATTACH_FORM,
XmNmarginWidth, 0,
XmNmarginHeight, 0,
XmNspacing, 0,
XmNwidth, gui.scrollbar_width,
XmNforeground, gui.scroll_fg_pixel,
XmNbackground, gui.scroll_fg_pixel,
NULL);
scrollbarBox[SB_BOTTOM] = XtVaCreateWidget("bottomScrollBarBox",
xmScrollBarWidgetClass, vimForm,
XmNorientation, XmHORIZONTAL,
XmNminimum, 0,
XmNvalue, 0,
XmNsliderSize, Columns,
XmNmaximum, Columns, /* Motif want one more than actual max */
XmNresizeHeight, False,
XmNbottomAttachment, XmATTACH_FORM,
XmNheight, gui.scrollbar_width,
XmNshadowThickness, 1,
XmNbackground, gui.scroll_fg_pixel,
XmNtroughColor, gui.scroll_bg_pixel,
NULL);
XtAddCallback(scrollbarBox[SB_BOTTOM], XmNvalueChangedCallback,
horiz_scroll_cb, (XtPointer)NULL);
XtAddCallback(scrollbarBox[SB_BOTTOM], XmNdragCallback,
horiz_scroll_cb, (XtPointer)NULL);
textArea = XtVaCreateManagedWidget("textArea",
xmPrimitiveWidgetClass, vimForm,
XmNtopAttachment, XmATTACH_WIDGET,
XmNtopWidget, menuBar,
XmNbackground, gui.back_pixel,
/* These take some control away from the user, but avoids making them
* add resources to get a decent looking setup. */
XmNborderWidth, 0,
XmNhighlightThickness, 0,
XmNshadowThickness, 0,
NULL);
/*
* If there are highlight or shadow borders, add their widths to our
* border offset so we don't draw over them.
*/
XtVaGetValues(textArea, XmNhighlightThickness, &n, NULL);
gui.border_offset += n;
XtVaGetValues(textArea, XmNshadowThickness, &n, NULL);
gui.border_offset += n;
/* Create the command line scroll bars */
for (i = 0; i < 2; i++)
{
gui.cmdline_sb.id[i] = XtVaCreateManagedWidget("cmdlineScrollBar",
xmScrollBarWidgetClass, scrollbarBox[i],
XmNshadowThickness, 1,
XmNshowArrows, False,
XmNbackground, gui.scroll_fg_pixel,
XmNtroughColor, gui.scroll_fg_pixel,
NULL);
XtAddCallback(gui.cmdline_sb.id[i], XmNvalueChangedCallback,
scroll_cb, (XtPointer)NULL);
XtAddCallback(gui.cmdline_sb.id[i], XmNdragCallback,
scroll_cb, (XtPointer)NULL);
}
gui.num_scrollbars = 1;
/*
* Text area callbacks
*/
XtAddEventHandler(textArea, VisibilityChangeMask, FALSE,
gui_x11_visibility_cb, (XtPointer)0);
XtAddEventHandler(textArea, ExposureMask, FALSE, gui_x11_expose_cb,
(XtPointer)0);
XtAddEventHandler(textArea, StructureNotifyMask, FALSE,
gui_x11_resize_window_cb, (XtPointer)0);
XtAddEventHandler(textArea, FocusChangeMask, FALSE, gui_x11_focus_change_cb,
(XtPointer)0);
XtAddEventHandler(textArea, KeyPressMask, FALSE, gui_x11_key_hit_cb,
(XtPointer)0);
XtAddEventHandler(textArea, ButtonPressMask | ButtonReleaseMask |
ButtonMotionMask, FALSE, gui_x11_mouse_cb, (XtPointer)0);
}
int
gui_mch_get_winsize()
{
Dimension n;
Dimension base_width = 0, base_height = 0;
if (gui.which_scrollbars[SB_LEFT])
{
XtVaGetValues(scrollbarBox[SB_LEFT], XmNwidth, &n, NULL);
base_width += n;
}
if (gui.which_scrollbars[SB_RIGHT])
{
XtVaGetValues(scrollbarBox[SB_RIGHT], XmNwidth, &n, NULL);
base_width += n;
}
if (gui.which_scrollbars[SB_BOTTOM])
{
XtVaGetValues(scrollbarBox[SB_BOTTOM], XmNheight, &n, NULL);
base_height += n;
}
base_height += 2 * gui.border_offset;
base_width += 2 * gui.border_offset;
if (gui.menu_is_active)
{
XtVaGetValues(menuBar, XmNheight, &n, NULL);
base_height += n;
}
XtVaGetValues(vimShell, XmNheight, &n, NULL);
gui.num_rows = (int)(n - base_height) / (int)gui.char_height;
XtVaGetValues(vimShell, XmNwidth, &n, NULL);
gui.num_cols = (int)(n - base_width) / (int)gui.char_width;
Rows = gui.num_rows;
Columns = gui.num_cols;
gui_reset_scroll_region();
return OK;
}
void
gui_mch_set_winsize()
{
Dimension left_width, right_width, bottom_height, menu_height;
Dimension base_width = 0, base_height = 0;
base_width += 2 * gui.border_offset;
base_height += 2 * gui.border_offset;
if (gui.which_scrollbars[SB_LEFT])
{
XtVaGetValues(scrollbarBox[SB_LEFT], XmNwidth, &left_width, NULL);
base_width += left_width;
}
if (gui.which_scrollbars[SB_RIGHT])
{
XtVaGetValues(scrollbarBox[SB_RIGHT], XmNwidth, &right_width, NULL);
base_width += right_width;
}
if (gui.which_scrollbars[SB_BOTTOM])
{
XtVaGetValues(scrollbarBox[SB_BOTTOM], XmNheight, &bottom_height, NULL);
base_height += bottom_height;
}
if (gui.menu_is_active)
{
XtVaGetValues(menuBar, XmNheight, &menu_height, NULL);
base_height += menu_height;
}
XtVaSetValues(vimShell,
#ifdef XmNbaseWidth
XmNbaseWidth, base_width,
XmNbaseHeight, base_height,
#endif
XmNwidthInc, gui.char_width,
XmNheightInc, gui.char_height,
XmNminWidth, base_width + MIN_COLUMNS * gui.char_width,
XmNminHeight, base_height + MIN_ROWS * gui.char_height,
XmNwidth, base_width + Columns * gui.char_width,
XmNheight, base_height + Rows * gui.char_height,
NULL);
}
/*
* Menu stuff.
*/
void
gui_mch_add_menu(menu, parent)
GuiMenu *menu;
GuiMenu *parent;
{
#if (XmVersion >= 1002)
Widget widget;
XmString label = XmStringCreate((char *)menu->name,
XmFONTLIST_DEFAULT_TAG);
#else
XmString label = XmStringCreate((char *)menu->name,
XmSTRING_DEFAULT_CHARSET);
#endif
Widget shell;
menu->id = XtVaCreateWidget("subMenu",
xmCascadeButtonWidgetClass,
(parent == NULL) ? menuBar : parent->submenu_id,
XmNlabelString, label,
XmNforeground, gui.menu_fg_pixel,
XmNbackground, gui.menu_bg_pixel,
NULL);
/* XtFree((char *)label); makes Lesstif crash */
/* if 'guic' contains 'g', make menu's contain grey items */
if (vim_strchr(p_guioptions, GO_GREY) != NULL)
XtManageChild(menu->id);
shell = XtVaCreateWidget("subMenuShell",
xmMenuShellWidgetClass, menu->id,
XmNwidth, 1,
XmNheight, 1,
XmNforeground, gui.menu_fg_pixel,
XmNbackground, gui.menu_bg_pixel,
NULL);
menu->submenu_id = XtVaCreateWidget("rowColumnMenu",
xmRowColumnWidgetClass, shell,
XmNrowColumnType, XmMENU_PULLDOWN,
#if (XmVersion >= 1002)
XmNtearOffModel, XmTEAR_OFF_ENABLED,
#endif
NULL);
#if (XmVersion >= 1002)
/* Set the colors for the tear off widget */
if ((widget = XmGetTearOffControl(menu->submenu_id)) != (Widget)NULL)
XtVaSetValues(widget,
XmNforeground, gui.menu_fg_pixel,
XmNbackground, gui.menu_bg_pixel,
NULL);
#endif
XtVaSetValues(menu->id,
XmNsubMenuId, menu->submenu_id,
NULL);
/*
* The "Help" menu is a special case, and should be placed at the far right
* hand side of the menu-bar.
*/
if (parent == NULL && STRCMP((char *)menu->name, "Help") == 0)
XtVaSetValues(menuBar,
XmNmenuHelpWidget, menu->id,
NULL);
if (parent == NULL)
XtVaSetValues(XtParent(menu->id),
XmNforeground, gui.menu_fg_pixel,
XmNbackground, gui.menu_bg_pixel,
NULL);
}
void
gui_mch_add_menu_item(menu, parent)
GuiMenu *menu;
GuiMenu *parent;
{
#if (XmVersion >= 1002)
XmString label = XmStringCreate((char *)menu->name,
XmFONTLIST_DEFAULT_TAG);
#else
XmString label = XmStringCreate((char *)menu->name,
XmSTRING_DEFAULT_CHARSET);
#endif
menu->submenu_id = (Widget)0;
menu->id = XtVaCreateWidget("subMenu",
xmPushButtonWidgetClass, parent->submenu_id,
XmNlabelString, label,
XmNforeground, gui.menu_fg_pixel,
XmNbackground, gui.menu_bg_pixel,
NULL);
/* XtFree((char *)label); makes Lesstif crash */
if (vim_strchr(p_guioptions, GO_GREY) != NULL)
XtManageChild(menu->id);
XtAddCallback(menu->id, XmNactivateCallback, gui_x11_menu_cb,
(XtPointer)menu);
}
/*
* Destroy the machine specific menu widget.
*/
void
gui_mch_destroy_menu(menu)
GuiMenu *menu;
{
if (menu->id != (Widget)0)
XtDestroyWidget(menu->id);
if (menu->submenu_id != (Widget)0)
XtDestroyWidget(menu->submenu_id);
}
/*
* Scrollbar stuff:
*/
void
gui_mch_create_which_components()
{
static int prev_which_scrollbars[3] = {FALSE, FALSE, FALSE};
int i;
char *attach = NULL, *widget = NULL; /* NOT char_u */
WIN *wp;
gui_x11_use_resize_callback(textArea, FALSE);
for (i = 0; i < 3; i++)
{
switch (i)
{
case SB_LEFT: attach = XmNleftAttachment;
widget = XmNleftWidget; break;
case SB_RIGHT: attach = XmNrightAttachment;
widget = XmNrightWidget; break;
case SB_BOTTOM: attach = XmNbottomAttachment;
widget = XmNbottomWidget; break;
}
if (gui.which_scrollbars[i])
{
XtManageChild(scrollbarBox[i]);
XtVaSetValues(textArea,
attach, XmATTACH_WIDGET,
widget, scrollbarBox[i],
NULL);
if (i != SB_BOTTOM && gui.which_scrollbars[SB_BOTTOM])
XtVaSetValues(scrollbarBox[SB_BOTTOM],
attach, XmATTACH_WIDGET,
widget, scrollbarBox[i],
NULL);
}
else
{
XtUnmanageChild(scrollbarBox[i]);
XtVaSetValues(textArea,
attach, XmATTACH_FORM,
NULL);
if (i != SB_BOTTOM && gui.which_scrollbars[SB_BOTTOM])
XtVaSetValues(scrollbarBox[SB_BOTTOM],
attach, XmATTACH_FORM,
NULL);
}
if (gui.which_scrollbars[i] != prev_which_scrollbars[i])
{
if (i == SB_LEFT || i == SB_RIGHT)
{
if (gui.which_scrollbars[i])
{
/* Scrollbar box has just appeared */
gui.new_sb[i] = TRUE;
}
else
{
/* Scrollbar box has just been deleted */
for (wp = firstwin; wp != NULL; wp = wp->w_next)
XtDestroyWidget(wp->w_scrollbar.id[i]);
}
}
prev_which_scrollbars[i] = gui.which_scrollbars[i];
}
}
if (gui.menu_is_active)
{
XtManageChild(menuBar);
XtVaSetValues(textArea, XmNtopAttachment, XmATTACH_WIDGET,
XmNtopWidget, menuBar, NULL);
if (gui.which_scrollbars[SB_LEFT])
{
XtVaSetValues(scrollbarBox[SB_LEFT],
XmNtopAttachment, XmATTACH_WIDGET,
XmNtopWidget, menuBar,
NULL);
}
if (gui.which_scrollbars[SB_RIGHT])
{
XtVaSetValues(scrollbarBox[SB_RIGHT],
XmNtopAttachment, XmATTACH_WIDGET,
XmNtopWidget, menuBar,
NULL);
}
}
else
{
XtUnmanageChild(menuBar);
XtVaSetValues(textArea, XmNtopAttachment, XmATTACH_FORM, NULL);
if (gui.which_scrollbars[SB_LEFT])
{
XtVaSetValues(scrollbarBox[SB_LEFT],
XmNtopAttachment, XmATTACH_FORM, NULL);
}
if (gui.which_scrollbars[SB_RIGHT])
{
XtVaSetValues(scrollbarBox[SB_RIGHT],
XmNtopAttachment, XmATTACH_FORM, NULL);
}
}
gui_x11_use_resize_callback(textArea, TRUE);
if (vimForm != (Widget)NULL)
gui_mch_set_winsize();
}
/*
* Vertical scrollbar stuff:
*/
void
gui_mch_update_scrollbars(worst_update, which_sb)
int worst_update;
int which_sb; /* SB_LEFT or SB_RIGHT */
{
WIN *wp;
GuiScrollbar *sb;
int idx;
Dimension h; /* Height of scrollbar (in pixels) */
Dimension y; /* Coord of top of scrollbar (in pixels) */
int tmp;
int val = 0, size = 0, max = 0;
if (worst_update >= SB_UPDATE_HEIGHT)
{
gui_x11_use_resize_callback(textArea, FALSE);
XtUnmanageChild(scrollbarBox[which_sb]);
}
for (wp = firstwin, idx = 0; wp; wp = wp->w_next, idx++)
{
sb = &wp->w_scrollbar;
if (sb->update[which_sb] >= SB_UPDATE_VALUE)
{
val = sb->value;
size = sb->size;
max = sb->max + 1; /* Motif has max one past the end */
}
if (sb->update[which_sb] == SB_UPDATE_CREATE)
{
sb->id[which_sb] = XtVaCreateManagedWidget("scrollBar",
xmScrollBarWidgetClass, scrollbarBox[which_sb],
XmNshadowThickness, 1,
#if (XmVersion >= 1002) /* What do we do otherwise? */
XmNpositionIndex, idx,
#endif
XmNminimum, 1,
XmNmaximum, max,
XmNbackground, gui.scroll_fg_pixel,
XmNtroughColor, gui.scroll_bg_pixel,
NULL);
XtAddCallback(sb->id[which_sb], XmNvalueChangedCallback,
scroll_cb, (XtPointer)wp);
XtAddCallback(sb->id[which_sb], XmNdragCallback,
scroll_cb, (XtPointer)wp);
}
if (sb->update[which_sb] >= SB_UPDATE_HEIGHT)
{
h = sb->height * gui.char_height
+ sb->status_height * gui.char_height / 2;
y = wp->w_winpos * gui.char_height;
if (wp == firstwin)
{
/* Height of top scrollbar includes width of top border */
h += gui.border_offset;
}
else
{
/*
* Height of other scrollbars includes half of status bar above
*/
tmp = wp->w_prev->w_status_height * (gui.char_height + 1) / 2;
h += tmp;
y += gui.border_offset - tmp;
}
XtVaSetValues(sb->id[which_sb],
XmNvalue, val,
XmNsliderSize, size,
XmNpageIncrement, (size > 2 ? size - 2 : 1),
XmNmaximum, max,
XmNheight, h,
XmNy, y,
NULL);
}
else if (sb->update[which_sb] == SB_UPDATE_VALUE)
{
XtVaSetValues(sb->id[which_sb],
XmNvalue, val,
XmNsliderSize, size,
XmNpageIncrement, (size > 2 ? size - 2 : 1),
XmNmaximum, max,
NULL);
}
sb->update[which_sb] = SB_UPDATE_NOTHING;
}
/* Command line scrollbar */
sb = &gui.cmdline_sb;
max = sb->max + 1; /* Motif has max one past the end */
if (sb->update[which_sb] == SB_UPDATE_HEIGHT)
{
h = lastwin->w_status_height * (gui.char_height + 1) / 2;
y = (Rows - sb->height) * gui.char_height - h;
h += sb->height * gui.char_height;
/* Height of cmdline scrollbar includes width of bottom border */
h += gui.border_offset;
XtVaSetValues(sb->id[which_sb],
XmNvalue, sb->value,
XmNsliderSize, sb->size,
XmNmaximum, max,
XmNheight, h,
XmNy, y,
NULL);
}
else if (sb->update[which_sb] == SB_UPDATE_VALUE)
{
XtVaSetValues(sb->id[which_sb],
XmNvalue, sb->value,
XmNsliderSize, sb->size,
XmNmaximum, max,
NULL);
}
sb->update[which_sb] = SB_UPDATE_NOTHING;
if (worst_update >= SB_UPDATE_HEIGHT)
{
if (worst_update >= SB_UPDATE_CREATE)
gui_mch_reorder_scrollbars(which_sb);
XtManageChild(scrollbarBox[which_sb]);
gui_x11_use_resize_callback(textArea, TRUE);
}
}
void
gui_mch_reorder_scrollbars(which_sb)
int which_sb;
{
Widget *children;
int num_children;
Widget tmp;
WIN *wp, *wp2;
int i, j;
XtVaGetValues(scrollbarBox[which_sb],
XmNchildren, &children,
XmNnumChildren, &num_children,
NULL);
/* Should be in same order as in the window list */
wp = firstwin;
for (i = 0; i < num_children; i++, wp = wp->w_next)
{
if (wp == NULL)
break; /* Shouldn't happen */
if (wp->w_scrollbar.id[which_sb] != children[i])
{
/* It's in the wrong place, find what should go here */
wp2 = wp->w_next;
for (j = i + 1; j < num_children; j++, wp2 = wp2->w_next)
{
if (wp2 == NULL)
break; /* Shouldn't happen */
if (wp->w_scrollbar.id[which_sb] == children[j])
break; /* Found it */
}
if (j >= num_children || wp2 == NULL)
break; /* Shouldn't happen */
tmp = children[i];
children[i] = children[j];
children[j] = tmp;
}
}
XtVaSetValues(scrollbarBox[which_sb],
XmNchildren, children,
NULL);
}
void
gui_mch_destroy_scrollbar(wp)
WIN *wp;
{
if (gui.which_scrollbars[SB_LEFT])
XtDestroyWidget(wp->w_scrollbar.id[SB_LEFT]);
if (gui.which_scrollbars[SB_RIGHT])
XtDestroyWidget(wp->w_scrollbar.id[SB_RIGHT]);
gui.num_scrollbars--;
}
/*
* Horizontal scrollbar stuff:
*/
void
gui_mch_update_horiz_scrollbar(value, size, max)
int value;
int size;
int max;
{
static int prev_value = -1, prev_size = -1, prev_max = -1;
if (value == prev_value && size == prev_size && max == prev_max)
return;
prev_value = value;
prev_size = size;
prev_max = max;
XtVaSetValues(scrollbarBox[SB_BOTTOM],
XmNvalue, value,
XmNsliderSize, size,
XmNpageIncrement, (size > 2 ? size - 2 : 1),
XmNmaximum, max,
NULL);
}
Window
gui_mch_get_wid()
{
return( XtWindow(textArea) );
}